package com.zx._01_基础._014_枚举;

// 枚举的现实意义：就是预先创建好若干个对象，并且这个对象是不可变的。
public class BaseDemo {

    // 用法一：常量
    // 在JDK1.5 之前，我们定义常量都是： public static fianl。
    // 现在好了，有了枚举，可以把相关的常量分组到一个枚举类型里，而且枚举提供了比常量更多的方法。
    public enum Color1 {
        RED, GREEN, BLANK, YELLOW
    }

    // 用法二：switch
    // JDK1.6之前的switch语句只支持int,char,enum类型，使用枚举，能让我们的代码可读性更强。
    enum Color2 {
        GREEN, YELLOW, RED
    }

    // 用法三：向枚举中添加新方法
    // 如果打算自定义自己的方法，那么必须在enum实例序列的最后添加一个分号。而且 Java 要求必须先定义 enum 实例。
    public enum Color3 {
        RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);

        // 成员变量
        private String name;
        private int index;

        // 构造方法
        private Color3(String name, int index) {
            this.name = name;
            this.index = index;
        }

        // 普通方法
        public static String getName(int index) {
            for (Color3 c : Color3.values()) {
                if (c.getIndex() == index) {
                    return c.name;
                }
            }
            return null;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getIndex() {
            return index;
        }

        public void setIndex(int index) {
            this.index = index;
        }
    }

    // 用法四：覆盖枚举的方法
    // 下面给出一个toString()方法覆盖的例子。
    public enum Color4 {
        RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);
        // 成员变量
        private String name;
        private int index;

        // 构造方法
        private Color4(String name, int index) {
            this.name = name;
            this.index = index;
        }

        // 覆盖方法
        @Override
        public String toString() {
            return this.index + "_" + this.name;
        }
    }

    public enum Color5 implements Behaviour {
        RED("红色", 1), GREEN("绿色", 2), BLANK("白色", 3), YELLO("黄色", 4);

        // 成员变量
        private String name;
        private int index;

        // 构造方法
        private Color5(String name, int index) {
            this.name = name;
            this.index = index;
        }

        // 接口方法
        @Override
        public String getInfo() {
            return this.name;
        }

        // 接口方法
        @Override
        public void print() {
            System.out.println(this.index + ":" + this.name);
        }
    }

    // 用法五：实现接口
    // 所有的枚举都继承自java.lang.Enum类。由于Java 不支持多继承，所以枚举对象不能再继承其他类。
    public interface Behaviour {

        void print();

        String getInfo();
    }

    // 用法六：使用接口组织枚举
    public interface Food {

        enum Coffee implements Food {
            BLACK_COFFEE, DECAF_COFFEE, LATTE, CAPPUCCINO
        }

        enum Dessert implements Food {
            FRUIT, CAKE, GELATO
        }
    }

    public class TrafficLight {

        Color2 color = Color2.RED;

        public void change() {
            switch (color) {
                case RED:
                    color = Color2.GREEN;
                    break;
                case YELLOW:
                    color = Color2.RED;
                    break;
                case GREEN:
                    color = Color2.YELLOW;
                    break;
            }
        }
    }

    // 用法七：关于枚举集合的使用
    // java.util.EnumSet和java.util.EnumMap是两个枚举集合。
    // EnumSet保证集合中的元素不重复；EnumMap中的 key是enum类型，而value则可以是任意类型。
    // 关于这个两个集合的使用就不在这里赘述，可以参考JDK文档。

}
